{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "sns.set()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Date</th>\n",
       "      <th>Open</th>\n",
       "      <th>High</th>\n",
       "      <th>Low</th>\n",
       "      <th>Close</th>\n",
       "      <th>Adj Close</th>\n",
       "      <th>Volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2016-11-02</td>\n",
       "      <td>778.200012</td>\n",
       "      <td>781.650024</td>\n",
       "      <td>763.450012</td>\n",
       "      <td>768.700012</td>\n",
       "      <td>768.700012</td>\n",
       "      <td>1872400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2016-11-03</td>\n",
       "      <td>767.250000</td>\n",
       "      <td>769.950012</td>\n",
       "      <td>759.030029</td>\n",
       "      <td>762.130005</td>\n",
       "      <td>762.130005</td>\n",
       "      <td>1943200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2016-11-04</td>\n",
       "      <td>750.659973</td>\n",
       "      <td>770.359985</td>\n",
       "      <td>750.560974</td>\n",
       "      <td>762.020020</td>\n",
       "      <td>762.020020</td>\n",
       "      <td>2134800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2016-11-07</td>\n",
       "      <td>774.500000</td>\n",
       "      <td>785.190002</td>\n",
       "      <td>772.549988</td>\n",
       "      <td>782.520020</td>\n",
       "      <td>782.520020</td>\n",
       "      <td>1585100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2016-11-08</td>\n",
       "      <td>783.400024</td>\n",
       "      <td>795.632996</td>\n",
       "      <td>780.190002</td>\n",
       "      <td>790.510010</td>\n",
       "      <td>790.510010</td>\n",
       "      <td>1350800</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Date        Open        High         Low       Close   Adj Close  \\\n",
       "0  2016-11-02  778.200012  781.650024  763.450012  768.700012  768.700012   \n",
       "1  2016-11-03  767.250000  769.950012  759.030029  762.130005  762.130005   \n",
       "2  2016-11-04  750.659973  770.359985  750.560974  762.020020  762.020020   \n",
       "3  2016-11-07  774.500000  785.190002  772.549988  782.520020  782.520020   \n",
       "4  2016-11-08  783.400024  795.632996  780.190002  790.510010  790.510010   \n",
       "\n",
       "    Volume  \n",
       "0  1872400  \n",
       "1  1943200  \n",
       "2  2134800  \n",
       "3  1585100  \n",
       "4  1350800  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('../dataset/GOOG-year.csv')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import deque\n",
    "import random\n",
    "\n",
    "class Agent:\n",
    "\n",
    "    LEARNING_RATE = 0.003\n",
    "    BATCH_SIZE = 32\n",
    "    LAYER_SIZE = 128\n",
    "    OUTPUT_SIZE = 3\n",
    "    EPSILON = 0.5\n",
    "    DECAY_RATE = 0.005\n",
    "    MIN_EPSILON = 0.1\n",
    "    GAMMA = 0.99\n",
    "    MEMORIES = deque()\n",
    "    COPY = 1000\n",
    "    T_COPY = 0\n",
    "    MEMORY_SIZE = 300\n",
    "    \n",
    "    def __init__(self, state_size, window_size, trend, skip):\n",
    "        self.state_size = state_size\n",
    "        self.window_size = window_size\n",
    "        self.half_window = window_size // 2\n",
    "        self.trend = trend\n",
    "        self.skip = skip\n",
    "        tf.reset_default_graph()\n",
    "        self.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
    "        self.X = tf.placeholder(tf.float32, (None, None, self.state_size))\n",
    "        self.Y = tf.placeholder(tf.float32, (None, None, self.state_size))\n",
    "        self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * self.LAYER_SIZE))\n",
    "        self.ACTION = tf.placeholder(tf.float32, (None))\n",
    "        self.REWARD = tf.placeholder(tf.float32, (None))\n",
    "        self.batch_size = tf.shape(self.ACTION)[0]\n",
    "        self.seq_len = tf.shape(self.X)[1]\n",
    "        \n",
    "        with tf.variable_scope('curiosity_model'):\n",
    "            action = tf.reshape(self.ACTION, (-1,1,1))\n",
    "            repeat_action = tf.tile(action, [1,self.seq_len,1])\n",
    "            state_action = tf.concat([self.X, repeat_action], axis=-1)\n",
    "            save_state = tf.identity(self.Y)\n",
    "            cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
    "            self.rnn,last_state = tf.nn.dynamic_rnn(inputs=state_action,cell=cell,\n",
    "                                                    dtype=tf.float32,\n",
    "                                                    initial_state=self.hidden_layer)\n",
    "            self.curiosity_logits = tf.layers.dense(self.rnn[:,-1], self.state_size)\n",
    "            self.curiosity_cost = tf.reduce_sum(tf.square(save_state[:,-1] - self.curiosity_logits), axis=1)\n",
    "            \n",
    "            self.curiosity_optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE)\\\n",
    "            .minimize(tf.reduce_mean(self.curiosity_cost))\n",
    "        \n",
    "        total_reward = tf.add(self.curiosity_cost, self.REWARD)\n",
    "        \n",
    "        with tf.variable_scope(\"q_model\"):\n",
    "            with tf.variable_scope(\"eval_net\"):\n",
    "                cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
    "                rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X,cell=cell,\n",
    "                                                    dtype=tf.float32,\n",
    "                                                    initial_state=self.hidden_layer)\n",
    "                self.logits = tf.layers.dense(rnn[:,-1], self.OUTPUT_SIZE)\n",
    "            \n",
    "            with tf.variable_scope(\"target_net\"):\n",
    "                cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
    "                rnn,last_state = tf.nn.dynamic_rnn(inputs=self.Y,cell=cell,\n",
    "                                                    dtype=tf.float32,\n",
    "                                                    initial_state=self.hidden_layer)\n",
    "                y_q = tf.layers.dense(rnn[:,-1], self.OUTPUT_SIZE)\n",
    "            \n",
    "            q_target = total_reward + self.GAMMA * tf.reduce_max(y_q, axis=1)\n",
    "            action = tf.cast(self.ACTION, tf.int32)\n",
    "            action_indices = tf.stack([tf.range(self.batch_size, dtype=tf.int32), action], axis=1)\n",
    "            q = tf.gather_nd(params=self.logits, indices=action_indices)\n",
    "            self.cost = tf.losses.mean_squared_error(labels=q_target, predictions=q)\n",
    "            self.optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE).minimize(\n",
    "            self.cost, var_list=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, \"q_model/eval_net\"))\n",
    "            \n",
    "        t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/target_net')\n",
    "        e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/eval_net')\n",
    "        self.target_replace_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]\n",
    "        \n",
    "        self.sess = tf.InteractiveSession()\n",
    "        self.sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    def _memorize(self, state, action, reward, new_state, done, rnn_state):\n",
    "        self.MEMORIES.append((state, action, reward, new_state, done, rnn_state))\n",
    "        if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
    "            self.MEMORIES.popleft()\n",
    "            \n",
    "    def get_state(self, t):\n",
    "        window_size = self.window_size + 1\n",
    "        d = t - window_size + 1\n",
    "        block = self.trend[d : t + 1] if d >= 0 else -d * [self.trend[0]] + self.trend[0 : t + 1]\n",
    "        res = []\n",
    "        for i in range(window_size - 1):\n",
    "            res.append(block[i + 1] - block[i])\n",
    "        return np.array(res)\n",
    "    \n",
    "    def _construct_memories(self, replay):\n",
    "        states = np.array([a[0] for a in replay])\n",
    "        actions = np.array([a[1] for a in replay])\n",
    "        rewards = np.array([a[2] for a in replay])\n",
    "        new_states = np.array([a[3] for a in replay])\n",
    "        init_values = np.array([a[-1] for a in replay])\n",
    "        if (self.T_COPY + 1) % self.COPY == 0:\n",
    "            self.sess.run(self.target_replace_op)\n",
    "            \n",
    "        cost, _ = self.sess.run([self.cost, self.optimizer], feed_dict = {\n",
    "            self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards,\n",
    "            self.hidden_layer: init_values\n",
    "        })\n",
    "        \n",
    "        if (self.T_COPY + 1) % self.COPY == 0:\n",
    "            self.sess.run(self.curiosity_optimizer, feed_dict = {\n",
    "                self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards,\n",
    "                self.hidden_layer: init_values\n",
    "            })\n",
    "        return cost\n",
    "    \n",
    "    def buy(self, initial_money):\n",
    "        starting_money = initial_money\n",
    "        states_sell = []\n",
    "        states_buy = []\n",
    "        inventory = []\n",
    "        state = self.get_state(0)\n",
    "        init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
    "        for k in range(self.INITIAL_FEATURES.shape[0]):\n",
    "            self.INITIAL_FEATURES[k,:] = state\n",
    "        for t in range(0, len(self.trend) - 1, self.skip):\n",
    "            \n",
    "            if np.random.rand() < self.EPSILON:\n",
    "                action = np.random.randint(self.OUTPUT_SIZE)\n",
    "            else:\n",
    "                action, last_state = self.sess.run([self.logits,\n",
    "                                                  self.last_state],\n",
    "                                                  feed_dict={self.X:[self.INITIAL_FEATURES],\n",
    "                                                             self.hidden_layer:init_value})\n",
    "                action, init_value = np.argmax(action[0]), last_state\n",
    "                    \n",
    "            next_state = self.get_state(t + 1)\n",
    "            \n",
    "            if action == 1 and initial_money >= self.trend[t]:\n",
    "                inventory.append(self.trend[t])\n",
    "                initial_money -= self.trend[t]\n",
    "                states_buy.append(t)\n",
    "                print('day %d: buy 1 unit at price %f, total balance %f'% (t, self.trend[t], initial_money))\n",
    "            \n",
    "            elif action == 2 and len(inventory):\n",
    "                bought_price = inventory.pop(0)\n",
    "                initial_money += self.trend[t]\n",
    "                states_sell.append(t)\n",
    "                try:\n",
    "                    invest = ((close[t] - bought_price) / bought_price) * 100\n",
    "                except:\n",
    "                    invest = 0\n",
    "                print(\n",
    "                    'day %d, sell 1 unit at price %f, investment %f %%, total balance %f,'\n",
    "                    % (t, close[t], invest, initial_money)\n",
    "                )\n",
    "            \n",
    "            new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
    "            self.INITIAL_FEATURES = new_state\n",
    "        invest = ((initial_money - starting_money) / starting_money) * 100\n",
    "        total_gains = initial_money - starting_money\n",
    "        return states_buy, states_sell, total_gains, invest\n",
    "        \n",
    "    def train(self, iterations, checkpoint, initial_money):\n",
    "        for i in range(iterations):\n",
    "            total_profit = 0\n",
    "            inventory = []\n",
    "            state = self.get_state(0)\n",
    "            starting_money = initial_money\n",
    "            init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
    "            for k in range(self.INITIAL_FEATURES.shape[0]):\n",
    "                self.INITIAL_FEATURES[k,:] = state\n",
    "            for t in range(0, len(self.trend) - 1, self.skip):\n",
    "                if np.random.rand() < self.EPSILON:\n",
    "                    action = np.random.randint(self.OUTPUT_SIZE)\n",
    "                else:\n",
    "                    action, last_state = self.sess.run([self.logits,\n",
    "                                                  self.last_state],\n",
    "                                                  feed_dict={self.X:[self.INITIAL_FEATURES],\n",
    "                                                             self.hidden_layer:init_value})\n",
    "                    action, init_value = np.argmax(action[0]), last_state\n",
    "                    \n",
    "                next_state = self.get_state(t + 1)\n",
    "                \n",
    "                if action == 1 and starting_money >= self.trend[t]:\n",
    "                    inventory.append(self.trend[t])\n",
    "                    starting_money -= self.trend[t]\n",
    "                \n",
    "                elif action == 2 and len(inventory) > 0:\n",
    "                    bought_price = inventory.pop(0)\n",
    "                    total_profit += self.trend[t] - bought_price\n",
    "                    starting_money += self.trend[t]\n",
    "                    \n",
    "                invest = ((starting_money - initial_money) / initial_money)\n",
    "                new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
    "                self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
    "                               starting_money < initial_money, init_value[0])\n",
    "                self.INITIAL_FEATURES = new_state\n",
    "                batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
    "                replay = random.sample(self.MEMORIES, batch_size)\n",
    "                cost = self._construct_memories(replay)\n",
    "                self.T_COPY += 1\n",
    "                self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
    "            if (i+1) % checkpoint == 0:\n",
    "                print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
    "                                                                                  starting_money))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7ff38845bba8>: Using a concatenated state is slower and will soon be deprecated.  Use state_is_tuple=True.\n",
      "WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7ff2f112ed68>: Using a concatenated state is slower and will soon be deprecated.  Use state_is_tuple=True.\n",
      "WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7ff2f112eac8>: Using a concatenated state is slower and will soon be deprecated.  Use state_is_tuple=True.\n",
      "epoch: 10, total rewards: 685.860168.3, cost: 4139534.500000, total money: 977.580137\n",
      "epoch: 20, total rewards: 1724.255003.3, cost: 5132677.500000, total money: 5851.904966\n",
      "epoch: 30, total rewards: 493.970035.3, cost: 3979546.750000, total money: 8528.600039\n",
      "epoch: 40, total rewards: 1580.255128.3, cost: 5099559.000000, total money: 4018.855103\n",
      "epoch: 50, total rewards: 1467.990231.3, cost: 4410721.500000, total money: 8490.720211\n",
      "epoch: 60, total rewards: 1285.420161.3, cost: 3993190.000000, total money: 2688.440118\n",
      "epoch: 70, total rewards: 391.130068.3, cost: 3420379.000000, total money: 6491.710085\n",
      "epoch: 80, total rewards: 1276.110108.3, cost: 3443612.750000, total money: 3698.110047\n",
      "epoch: 90, total rewards: 672.475340.3, cost: 2882908.000000, total money: 208.605285\n",
      "epoch: 100, total rewards: 706.604982.3, cost: 3108476.500000, total money: 1169.724916\n",
      "epoch: 110, total rewards: 979.940367.3, cost: 2024909.750000, total money: 3200.720335\n",
      "epoch: 120, total rewards: 853.199893.3, cost: 4572564.500000, total money: 6070.309879\n",
      "epoch: 130, total rewards: 1339.975223.3, cost: 3904469.500000, total money: 7475.465274\n",
      "epoch: 140, total rewards: 1136.924864.3, cost: 4352429.000000, total money: 4448.164854\n",
      "epoch: 150, total rewards: 1499.745116.3, cost: 2398584.500000, total money: 3999.355042\n",
      "epoch: 160, total rewards: 481.755190.3, cost: 3168836.250000, total money: 7573.215212\n",
      "epoch: 170, total rewards: 1733.610290.3, cost: 1907320.875000, total money: 6940.950254\n",
      "epoch: 180, total rewards: 390.074828.3, cost: 2862924.000000, total money: 5516.364805\n",
      "epoch: 190, total rewards: 714.815121.3, cost: 2666878.750000, total money: 9726.615109\n",
      "epoch: 200, total rewards: 1474.129822.3, cost: 3016419.000000, total money: 1901.589906\n"
     ]
    }
   ],
   "source": [
    "close = df.Close.values.tolist()\n",
    "initial_money = 10000\n",
    "window_size = 30\n",
    "skip = 1\n",
    "batch_size = 32\n",
    "agent = Agent(state_size = window_size, \n",
    "              window_size = window_size, \n",
    "              trend = close, \n",
    "              skip = skip)\n",
    "agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "day 0: buy 1 unit at price 768.700012, total balance 9231.299988\n",
      "day 1, sell 1 unit at price 762.130005, investment -0.854691 %, total balance 9993.429993,\n",
      "day 4: buy 1 unit at price 790.510010, total balance 9202.919983\n",
      "day 5: buy 1 unit at price 785.309998, total balance 8417.609985\n",
      "day 8: buy 1 unit at price 736.080017, total balance 7681.529968\n",
      "day 9: buy 1 unit at price 758.489990, total balance 6923.039978\n",
      "day 11, sell 1 unit at price 771.229980, investment -2.438936 %, total balance 7694.269958,\n",
      "day 13: buy 1 unit at price 769.200012, total balance 6925.069946\n",
      "day 17: buy 1 unit at price 768.239990, total balance 6156.829956\n",
      "day 19, sell 1 unit at price 758.039978, investment -3.472517 %, total balance 6914.869934,\n",
      "day 25, sell 1 unit at price 776.419983, investment 5.480378 %, total balance 7691.289917,\n",
      "day 26: buy 1 unit at price 789.289978, total balance 6901.999939\n",
      "day 28: buy 1 unit at price 796.099976, total balance 6105.899963\n",
      "day 31: buy 1 unit at price 790.799988, total balance 5315.099975\n",
      "day 40, sell 1 unit at price 771.820007, investment 1.757441 %, total balance 6086.919982,\n",
      "day 46, sell 1 unit at price 804.789978, investment 4.626881 %, total balance 6891.709960,\n",
      "day 47, sell 1 unit at price 807.909973, investment 5.163749 %, total balance 7699.619933,\n",
      "day 50: buy 1 unit at price 804.609985, total balance 6895.009948\n",
      "day 57: buy 1 unit at price 832.150024, total balance 6062.859924\n",
      "day 58, sell 1 unit at price 823.309998, investment 4.310205 %, total balance 6886.169922,\n",
      "day 61: buy 1 unit at price 795.695007, total balance 6090.474915\n",
      "day 62: buy 1 unit at price 798.530029, total balance 5291.944886\n",
      "day 70: buy 1 unit at price 820.450012, total balance 4471.494874\n",
      "day 73: buy 1 unit at price 828.070007, total balance 3643.424867\n",
      "day 76: buy 1 unit at price 831.330017, total balance 2812.094850\n",
      "day 85: buy 1 unit at price 835.369995, total balance 1976.724855\n",
      "day 89, sell 1 unit at price 845.619995, investment 6.220327 %, total balance 2822.344850,\n",
      "day 91: buy 1 unit at price 848.780029, total balance 1973.564821\n",
      "day 98: buy 1 unit at price 819.510010, total balance 1154.054811\n",
      "day 100: buy 1 unit at price 831.409973, total balance 322.644838\n",
      "day 102, sell 1 unit at price 829.559998, investment 4.901367 %, total balance 1152.204836,\n",
      "day 111, sell 1 unit at price 823.559998, investment 2.355180 %, total balance 1975.764834,\n",
      "day 113: buy 1 unit at price 836.820007, total balance 1138.944827\n",
      "day 114, sell 1 unit at price 838.210022, investment 0.728234 %, total balance 1977.154849,\n",
      "day 117: buy 1 unit at price 862.760010, total balance 1114.394839\n",
      "day 118: buy 1 unit at price 872.299988, total balance 242.094851\n",
      "day 132, sell 1 unit at price 937.080017, investment 17.768744 %, total balance 1179.174868,\n",
      "day 138: buy 1 unit at price 948.820007, total balance 230.354861\n",
      "day 139, sell 1 unit at price 954.960022, investment 19.589745 %, total balance 1185.314883,\n",
      "day 140: buy 1 unit at price 969.539978, total balance 215.774905\n",
      "day 154, sell 1 unit at price 942.309998, investment 14.852823 %, total balance 1158.084903,\n",
      "day 158, sell 1 unit at price 959.450012, investment 15.865809 %, total balance 2117.534915,\n",
      "day 160: buy 1 unit at price 965.590027, total balance 1151.944888\n",
      "day 168: buy 1 unit at price 906.690002, total balance 245.254886\n",
      "day 169, sell 1 unit at price 918.590027, investment 10.496434 %, total balance 1163.844913,\n",
      "day 176: buy 1 unit at price 965.400024, total balance 198.444889\n",
      "day 189, sell 1 unit at price 927.960022, investment 11.083715 %, total balance 1126.404911,\n",
      "day 191: buy 1 unit at price 926.789978, total balance 199.614933\n",
      "day 195, sell 1 unit at price 922.669983, investment 8.705430 %, total balance 1122.284916,\n",
      "day 200, sell 1 unit at price 906.659973, investment 10.634399 %, total balance 2028.944889,\n",
      "day 201: buy 1 unit at price 924.690002, total balance 1104.254887\n",
      "day 202, sell 1 unit at price 927.000000, investment 11.497339 %, total balance 2031.254887,\n",
      "day 206: buy 1 unit at price 921.289978, total balance 1109.964909\n",
      "day 211: buy 1 unit at price 927.809998, total balance 182.154911\n",
      "day 220, sell 1 unit at price 921.809998, investment 10.156305 %, total balance 1103.964909,\n",
      "day 226, sell 1 unit at price 944.489990, investment 9.473084 %, total balance 2048.454899,\n",
      "day 228, sell 1 unit at price 959.109985, investment 9.951851 %, total balance 3007.564884,\n",
      "day 230: buy 1 unit at price 957.789978, total balance 2049.774906\n",
      "day 231, sell 1 unit at price 951.679993, investment 0.301426 %, total balance 3001.454899,\n",
      "day 234: buy 1 unit at price 977.000000, total balance 2024.454899\n",
      "day 237: buy 1 unit at price 987.830017, total balance 1036.624882\n",
      "day 238, sell 1 unit at price 989.679993, investment 2.077275 %, total balance 2026.304875,\n",
      "day 240: buy 1 unit at price 992.179993, total balance 1034.124882\n",
      "day 241: buy 1 unit at price 992.809998, total balance 41.314884\n",
      "day 242, sell 1 unit at price 984.450012, investment 1.953208 %, total balance 1025.764896,\n",
      "day 248, sell 1 unit at price 1019.270020, investment 12.416594 %, total balance 2045.034916,\n"
     ]
    }
   ],
   "source": [
    "states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize = (15,5))\n",
    "plt.plot(close, color='r', lw=2.)\n",
    "plt.plot(close, '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n",
    "plt.plot(close, 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\n",
    "plt.title('total gains %f, total investment %f%%'%(total_gains, invest))\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
